package com.smartleanx.module.hrm.service.employee;

import javax.validation.*;

import com.smartleanx.module.hrm.controller.admin.employee.contract.*;
import com.smartleanx.module.hrm.controller.admin.employee.vo.EmployeeDashboardPageReqVO;
import com.smartleanx.module.hrm.dal.dataobject.employee.EmployeeContractDO;
import com.smartleanx.framework.common.pojo.PageResult;

import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 员工合同 Service 接口
 *
 * @author tengcj
 */
public interface EmployeeContractService {

    /**
     * 创建员工合同
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createEmployeeContract(@Valid EmployeeContractSaveReqVO createReqVO);

    /**
     * 更新员工合同
     *
     * @param updateReqVO 更新信息
     */
    void updateEmployeeContract(@Valid EmployeeContractSaveReqVO updateReqVO);

    /**
     * 删除员工合同
     *
     * @param id 编号
     */
    void deleteEmployeeContract(Long id);

    /**
     * 根据员工id删除合同
     *
     * @param employeeId
     */
    void deleteByEmployeeId(Long employeeId);

    /**
     * 获得员工合同
     *
     * @param id 编号
     * @return 员工合同
     */
    EmployeeContractRespVO getEmployeeContract(Long id);

    /**
     * 实时计算员工合同结束日期、状态
     * @return
     */
    EmployeeContractSimpleRespVo getContractSimple(Integer year,Long startTime);

    /**
     * 实时获取合同状态
     * @param repVo
     * @return
     */
    Integer contractStatus(EmployeeContractRepVo repVo);

    /**
     * 根据员工id获得合同列表
     *
     * @param employeeId
     * @return
     */
    List<EmployeeContractRespVO> getEmployeeContractList(Long employeeId);

    /**
     * 批量获取员工执行中的合同
     *
     * @param employeeIds
     * @return
     */
    Map<Long, List<EmployeeContractRespVO>> getEmployeeContractMap(Collection<Long> employeeIds);

    /**
     * 获取所有合同信息
     *
     * @return
     */
    List<EmployeeContractRespVO> selectEmployeeAllContract();

    /**
     * 合同到期列表
     *
     * @param pageReqVO
     * @return
     */
    PageResult<EmployeeContractDO> selectContractExpirationPage(EmployeeDashboardPageReqVO pageReqVO);

    /**
     * 批量更新员工合同
     * @param list
     */
    void updateContractBatch(List<EmployeeContractDO> list);

    /**
     * 根据员工id获取各员工执行中合同列表
     * @param employeeIds
     * @return
     */
    List<EmployeeContractDO> getInProgressContractList(Collection<Long> employeeIds);

    /**
     * 根据员工id获取各员工合同列表
     *
     * @param employeeIdList
     * @return
     */
    List<EmployeeContractDO> getEmployeeContractList(Collection<Long> employeeIdList);

    /**
     * 终止合同
     * @param saveRepVO
     */
    void terminationContract(ContractTerminationSaveRepVO saveRepVO);

    /**
     * 获取当前员工最后一份合同（按照合同开始时间）
     * @param employeeId 员工id
     * @return
     */
    EmployeeContractDO getLastContract(Long employeeId);

    /**
     * 根据员工id删除合同
     *
     * @param employeeId
     */
    void deleteByEmployeeIdNew(Long employeeId);
}
